<?php

/**
 * \file
 * Classe `AccessCollection`.
 */

/**
 * Collections des accès.
 */ 
namespace pilar\Accesses /* \cond */ ; /* \endcond */
{

/**
 * Collection des accès.
 *
 * \since 28/04/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
class AccessCollection extends \object implements \IteratorAggregate {

 
/**
 * Dictionnaire qui à un nom d'accès associe sa valeur.
 */
public $_loadedAccesses;


protected function loadDefaultParams() {
 $this->params->define(array(
  'accessEntity' => '', // Entité des accès.
  'accessId' => '', // Champ donnant le nom (ou identifiant)  des accès.
  'accessEntityGrouper' => '', // Nom du champ permettant de grouper des
                               // accès
  'accessEntityGrouperValue' => '' // Valeur de ce champ.
 ));
}


protected function initialize() {
 parent::initialize();

 $this->_loadedAccesses = array();
}


/**
 * Réinitialise la collection en effaçant tous les paramètres.
 *
 * \since 12/09/2008
 */
public function clear() {
 unset($this->_loadedAccesses);
 $this->_loadedAccesses = array();
}


/**
 * Charge l'accès.
 *
 * \param $name Nom de l'accès à charger.
 * \since 28/04/2009
 */
private function loadAccess($name) {
 $ac = $this->param('accessEntity')->newCollection();
 $ac->where(
  \eq($ac->member($this->param('accessId')), \cst($name))
 );

 foreach ($ac as $a) {
  $this->_loadedAccesses[$a] = $a->id();
 }
}


/**
 * Retourne un accès en fonction de son nom.
 * L'accès est chargé si nécessaire.
 *
 * \param $name Nom de l'accès.
 * \since 28/04/2009
 */
public function access($name) {
 if (!$this->exists($name)) {
  $this->loadAccess($name);
 }

 return $this->_loadedAccesses[$name];
}


/**
 * Détermine si un accès existe dans la collection.
 *
 * C'est le cas si il a été défini via la méthode \a define .
 *
 * \param $name Nom du paramètre.
 * \return \c TRUE si le paramètre existe, \c FALSE sinon.
 *
 * \since 28/04/2009
 */
public function exists($name) {
 return array_key_exists($name, $this->_loadedAccesses);
}


/**
 * Charge toutes les accès disponibles.
 *
 * \since 01/10/2008
 */
private function loadAll() {
 GLOBAL $KER;

 $oc = $KER->entities->Access->newCollection();
 
 // Si il y a un groupement des accès :
  if ($this->param('accessEntityGrouper') != '') {
   $oc->where(
    \eq(
     $oc->member($this->param('accessEntityGrouper')),
     \cst($this->param('accessEntityGrouperValue'))
    )
   );
  }

 foreach ($oc as $o) {
  $this->_loadedAccesses[$o->member($this->param('accessId'))->get()]
   = $o->id();
 }
}


public function getIterator() {
 // On force le chargement de tous les accès (puisqu'on les veut toutes).
  $this->loadAll();

 // On retourne un iterateur maison :
  return new \ArrayIterator($this->_loadedAccesses);
}


} // Class.

} // Namespace.

?>
